package com.he.DesignPatterns.Singleton;

/**
 * @description: 懒汉式方法3：静态内部类
 * @Author: HCL
 * @Date: 2024/8/23 16:09
 */
public class SingleFive {

//    静态内部类单例模式中实例由内部类创建，在加载外部类的过程中，是不会加载静态内部类的，
//    只有内部类的属性/方法被调用时才会被加载，并初始化其静态属性。静态属性由于被static 修饰，保证只被实例化一次，并且严格保证实例化顺序。
//    第一次加载singleton类时不会去初始化INSTANCE，只有第一次调用getInstance，虚拟机加载singletontiolder
//    并初始化INSTANCE，这样不仅能确保线程安全，也能保证singleton 类的唯一性。

    private static boolean flag = false; //还是有可能通过反射修改
    //1 私有构造
    private SingleFive(){
        synchronized (SingleFive.class){
            if (flag){
                throw new RuntimeException("不能创建多个对象");
            }
            flag = true;
        }
    }

    //2 创建静态内部类，并在里面声明并创建对象
    private static class SingletonHolder{
        private static final SingleFive INSTANCE = new SingleFive();
    }

    //3对外提供访问方法
    public static SingleFive getInstance(){
        return SingletonHolder.INSTANCE;
    }

    //当进行反序列化时会自动调用该方法，防止破坏单例模式
    public Object readSolve(){
        return SingletonHolder.INSTANCE;
    }
}
